Software is continually developed to provide a wide range of functionality. For example, software may be configured as applications that are developed for productivity (e.g., word processing and spreadsheets), to abstract functionality of a computing device (e.g., an operating system), to locate information (e.g., a browser), and so on. Traditional techniques that were employed to manage software (e.g., deploy and update the software), however, were often complicated by how the software was implemented.
For example, state of components of the software (e.g., an application) may be intertwined such that each is dependent, one to another. Further, state of components of applications may even be dependent on state of components of another application, e.g., interdependency between components of an application and an operating system and the state of those components. This intertwined nature may therefore cause the state of each of these components to be difficult to address on their own. Therefore, traditional techniques that were used to manage the software were forced to address the software as a whole, even in situations where state of a single component was at issue.